import json
import ast

# s_dic = '{"name": "ding", "age": 16}'
s_dic = '{"name": ["ding", "yu"], "age": [12, 18]}'
# 由于 json 语法规定 数组或对象之中的字符串必须使用双引号，不能使用单引号
# s_dic = "{'name': 'ding', 'age': 16}"  # 会报错

# method 1
dic1 = eval(s_dic)
print(dic1)
"""
通过 eval 进行转换就不存在上面使用 json 进行转换的问题。但是，使用 eval 却存在安全性的问题，比如下面的例子:

# 让用户输入 `user_info`
>>> user_info = input('input user info: ')
# 输入 {"name" : "john", "gender" : "male", "age": 28}，没问题
>>> user_dict = eval(user_info)
# 输入 __import__('os').system('dir')，user_dict 会列出当前的目录文件！
# 再输入一些删除命令，则可以把整个目录清空了！
>>> user_dict = eval(user_info)
"""

# method 2-1
dic2 = json.loads(s_dic)
print(dic2)

# method 2-2
s = json.dumps(dic2)  # dic2: dict
dic3 = json.loads(s)
print(dic3)

# method4  通过 ast 的 literal_eval（好处是字符串的bool类型可能是True，Python不认识，但是此方法可以避免这个问题）
# 最好用
dic4 = ast.literal_eval(s_dic)
print(dic4)

# example
json_str = '''
[
    {"name": "Alice", "age": 20, "gender": "female"},
    {"name": "Bob", "age": 25, "gender": "male"},
    {"name": "Charlie", "age": 30, "gender": "male"}
]
'''

people_list = json.loads(json_str)
print(people_list, type(people_list))

# 遍历这个列表，并统计每个性别对应的人数
gender_count = {'male': 0, 'female': 0}

for person in people_list:
    gender_count[person['gender']] += 1

print(gender_count)

# method5 -- 如果 value 里面是列表的话需要更改
dic = {}
txt = "{'name': 'xl', 'age': 12, 'car': {'type': '汽车', 'price': 10}, 'person': {'job': 'programmer', 'age': 3}}"
for data in txt.replace("{", "").replace("}", "").replace("\"", "").replace("'", "").split(","):
    dic[data.split(':')[0].strip()] = data.split(':')[1].strip()
print(dic, type(dic))

dic = {}
